package com.shuang.link1;


public class RemoveElements {
    public ListNode removeElements(ListNode head, int val) {
        //判断头节点（链表）是不是空，是空的直接返回就好了
        while (head == null) {
            return head;
        }

        //链表不是空的
        //定义一个虚拟头节点 不用单独判断头节点是否是目标值先删除头节点了
        ListNode vHead = new ListNode(0, head);

        //定义两个要移动的指针 curr当前要判断的目标值 pre目标值前面的值用来移除目标值后连接到目标值的下一个值
        ListNode pre = new ListNode();
        ListNode curr = new ListNode();

        pre = vHead;
        curr = head;

        //curr 要一直往后走用来遍历链表 pre则是当curr此刻的值不是目标值时要往后走一下走到curr的位置 保证pre指向的一直是curr的前一个节点
        while (curr != null){
            if (curr.val == val){
                pre.next = curr.next;
            }else {
                pre = curr;
            }
            curr = curr.next;
        }

        //返回新的头节点(原来的头节点可能被移除掉了)
        return vHead.next;
    }
}
